#include "Utility.h"
#include "Config.h"

#include <string.h>
#include <stdlib.h>

#include <time.h>
#include <Windows.h>


char* getFileNameByRelationNameWithExtension(char* name, char* ext)
{
    char* fileName = new char[strlen(PATH)+strlen(name)+strlen(ext)+1+1];
    strcpy(fileName,PATH);
    strcat(fileName,name);
    strcat(fileName,".");
    strcat(fileName,ext);
    return fileName;
};

char* getPrefixedFileNameByRelationNameWithExtension( char* name, char* prefix, char* extension )
{
    char* fileName 
        = new char[strlen(PATH)+strlen(prefix)+strlen(name)+strlen(".")+strlen(extension)+1];
    strcpy(fileName,PATH);
    strcat(fileName,prefix);
    strcat(fileName,name);
    strcat(fileName,".");
    strcat(fileName,extension);
    return fileName;    
}

char* getSegmentName(char* R, int N)
{
    char* numberAsString = new char[10];    
    itoa (N,numberAsString,10);

    char* name = new char[20];
    strcpy(name,"");
    strcat(name, "S");
    strcat(name, numberAsString);
    strcat(name, R);

    return name;
}

#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS  11644473600000000ULL
#endif

struct timezone 
{
    int  tz_minuteswest; /* minutes W of Greenwich */
    int  tz_dsttime;     /* type of dst correction */
};

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
    FILETIME ft;
    unsigned __int64 tmpres = 0;
    static int tzflag;

    if (NULL != tv)
    {
        GetSystemTimeAsFileTime(&ft);

        tmpres |= ft.dwHighDateTime;
        tmpres <<= 32;
        tmpres |= ft.dwLowDateTime;

        /*converting file time to unix epoch*/
        tmpres /= 10;  /*convert into microseconds*/
        tmpres -= DELTA_EPOCH_IN_MICROSECS; 
        tv->tv_sec = (long)(tmpres / 1000000UL);
        tv->tv_usec = (long)(tmpres % 1000000UL);
    }

    if (NULL != tz)
    {
        if (!tzflag)
        {
            _tzset();
            tzflag++;
        }
        tz->tz_minuteswest = _timezone / 60;
        tz->tz_dsttime = _daylight;
    }

    return 0;
}

double mysecond()
{
    struct timeval tp;
    struct timezone tzp;
    int i;

    i = gettimeofday(&tp,&tzp);
    return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 );
}